#include <iostream>
#include <cstring>

using namespace std;
/*
题目描述：
从顶部到底部最大的和
*/
const int maxv = 1005;
int vis[maxv][maxv];
int numSet[maxv][maxv];
int r;  //总共有多少行
int main()
{
    cin >> r;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin >> numSet[i][j];
        }
    }

    //保证它能够到达底部
    //vis[i][j] 表示从上往下到达第i行，第j列这个点所能达到的和的最大值
    vis[1][1] = numSet[1][1];  //初始化 到达第一行第1列这个点和最大为numSet[1][0]
    for(int i=2;i<=r;i++)  //从第二行开始
    {
        for(int j=1;j<=i;j++)
        {
            // if(j==1)
            //     vis[i][j] = vis[i-1][j] + numSet[i][j];
            // else
            // {
            //     vis[i][j] = max(vis[i-1][j]+numSet[i][j], vis[i-1][j-1]+numSet[i][j]);
            //     //在上方和左上方取点
            // }
            vis[i][j] = max(vis[i-1][j]+numSet[i][j], vis[i-1][j-1]+numSet[i][j]);
            
        }
    }

    int maxRes = 0;
    for(int k=1;k<=r;k++)
    {
        maxRes = max(maxRes,vis[r][k]);
    }
    cout << maxRes << endl;

    return 0;
}